/**
 * 百度地图地址解析与距离计算工具函数（包含同步兜底算法）
 * 北京时间：2025-11-13
 */

// 百度地图AK密钥（与main.js中保持一致）
const BAIDU_MAP_AK = '5wlqUjFj1QFedW2SlbUUiF4ybPSmiI0v'

/**
 * 动态加载百度地图API
 * @returns {Promise<void>}
 */
/**
 * 动态加载百度地图API
 * 北京时间：2025-11-13
 */
function loadBaiduMapAPI() {
  return new Promise((resolve, reject) => {
    if (typeof BMap !== 'undefined') {
      resolve()
      return
    }

    // 检查是否已经有加载中的脚本
    if (window.baiduMapLoading) {
      // 等待已有的加载完成
      const checkLoaded = setInterval(() => {
        if (typeof BMap !== 'undefined') {
          clearInterval(checkLoaded)
          resolve()
        }
      }, 100)
      return
    }

    window.baiduMapLoading = true
    const script = document.createElement('script')
    script.type = 'text/javascript'
    script.src = `https://api.map.baidu.com/api?v=3.0&ak=${BAIDU_MAP_AK}&callback=initBaiduMap`
    script.onerror = () => {
      window.baiduMapLoading = false
      reject(new Error('百度地图API加载失败，请检查网络连接'))
    }
    
    window.initBaiduMap = () => {
      window.baiduMapLoading = false
      resolve()
    }
    
    document.head.appendChild(script)
  })
}

/**
 * 检查BMap是否已加载
 * @returns {Promise<void>}
 */
/**
 * 等待百度地图对象可用
 * 北京时间：2025-11-13
 */
export function waitForBMap() {
  return new Promise(async (resolve, reject) => {
    if (typeof BMap !== 'undefined') {
      resolve()
      return
    }
    
    try {
      // 首先尝试动态加载API
      await loadBaiduMapAPI()
      resolve()
    } catch (error) {
      // 如果动态加载失败，回退到等待模式
      console.warn('动态加载百度地图API失败，尝试等待现有加载:', error.message)
      
      let attempts = 0
      const maxAttempts = 300 // 等待30秒
      const checkInterval = setInterval(() => {
        attempts++
        if (typeof BMap !== 'undefined') {
          clearInterval(checkInterval)
          resolve()
        } else if (attempts >= maxAttempts) {
          clearInterval(checkInterval)
          reject(new Error('百度地图API加载超时，请检查网络连接或刷新页面重试。如果问题持续存在，请联系技术支持。'))
        }
      }, 100)
    }
  })
}

/**
 * 地址解析为经纬度坐标（地理编码）
 * @param {string} address 详细地址
 * @returns {Promise<{longitude: number, latitude: number, address: string}>}
 */
/**
 * 地址解析为经纬度坐标（地理编码）
 * 北京时间：2025-11-13
 */
export function geocodeAddress(address) {
  return new Promise(async (resolve, reject) => {
    if (!address || !address.trim()) {
      reject(new Error('地址不能为空'))
      return
    }

    try {
      // 等待BMap加载完成
      await waitForBMap()
      
      // 创建地理编码实例
      const myGeo = new BMap.Geocoder()
    
      // 将地址解析结果显示在地图上，并调整地图视野
      myGeo.getPoint(address, function(point) {
        if (point) {
          resolve({
            longitude: point.lng,
            latitude: point.lat,
            address: address
          })
        } else {
          reject(new Error('地址解析失败，请检查地址是否正确'))
        }
      }, '全国')
    } catch (error) {
      reject(error)
    }
  })
}

/**
 * 经纬度坐标解析为地址（逆地理编码）
 * @param {number} longitude 经度
 * @param {number} latitude 纬度
 * @returns {Promise<string>}
 */
/**
 * 经纬度坐标解析为地址（逆地理编码）
 * 北京时间：2025-11-13
 */
export function reverseGeocodePoint(longitude, latitude) {
  return new Promise(async (resolve, reject) => {
    if (!longitude || !latitude) {
      reject(new Error('经纬度坐标不能为空'))
      return
    }

    try {
      // 等待BMap加载完成
      await waitForBMap()
      
      const myGeo = new BMap.Geocoder()
      const point = new BMap.Point(longitude, latitude)
      
      myGeo.getLocation(point, function(result) {
        if (result) {
          resolve(result.address)
        } else {
          reject(new Error('坐标解析失败'))
        }
      })
    } catch (error) {
      reject(error)
    }
  })
}

/**
 * 使用 Haversine 公式计算两点间距离（米）
 * 北京时间：2025-11-13
 */
export function haversineDistance(lat1, lng1, lat2, lng2) {
  const toRad = (v) => (v * Math.PI) / 180
  const R = 6378137
  const dLat = toRad(lat2 - lat1)
  const dLng = toRad(lng2 - lng1)
  const a = Math.sin(dLat / 2) ** 2 + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLng / 2) ** 2
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
  return Math.round(R * c)
}

/**
 * 计算两点间距离（米），优先使用百度地图API，失败时回退到 Haversine 公式
 * 北京时间：2025-11-13
 */
export async function calculateDistance(lat1, lng1, lat2, lng2) {
  try {
    await waitForBMap()
    const point1 = new BMap.Point(lng1, lat1)
    const point2 = new BMap.Point(lng2, lat2)
    return Math.round(point1.getDistance(point2))
  } catch (error) {
    return haversineDistance(lat1, lng1, lat2, lng2)
  }
}

/**
 * 验证坐标是否在电子围栏范围内
 * @param {number} targetLat 目标纬度
 * @param {number} targetLng 目标经度
 * @param {number} centerLat 中心纬度
 * @param {number} centerLng 中心经度
 * @param {number} radius 围栏半径（米）
 * @returns {boolean} 是否在范围内
 */
/**
 * 验证坐标是否在电子围栏范围内（同步判定，使用 Haversine 公式）
 * 北京时间：2025-11-13
 */
export function isInFence(targetLat, targetLng, centerLat, centerLng, radius) {
  const distance = haversineDistance(targetLat, targetLng, centerLat, centerLng)
  return distance <= radius
}

/**
 * 校验坐标范围（经度 -180~180，纬度 -90~90）
 * 北京时间：2025-11-13
 */
export function validateCoordinates(longitude, latitude) {
  const lngOk = typeof longitude === 'number' && longitude >= -180 && longitude <= 180
  const latOk = typeof latitude === 'number' && latitude >= -90 && latitude <= 90
  return lngOk && latOk
}

/**
 * 校验电子围栏半径（米），建议 1~3000 范围
 * 北京时间：2025-11-13
 */
export function validateRadius(radius) {
  const rOk = typeof radius === 'number' && radius >= 1 && radius <= 3000
  return rOk
}
